home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / sakiba / source / select.c < prev    next >
Text File  |  2000-06-23  |  9KB  |  379 lines

  1. /*************************************************
  2.  
  3.     格闘シミュレーション「さきば」
  4.  
  5.         モード・キャラクタセレクト
  6.  
  7.  *************************************************/
  8.  
  9. #include    <stdio.h>
  10. #include    <stdlib.h>
  11. #include    <sys\dos.h>
  12. #include    <sys\iocs.h>
  13.  
  14. #include    "sakiba.h"
  15. #include    "select.h"
  16. #include    "screen.h"
  17. #include    "pad.h"
  18. #include    "sound.h"
  19.  
  20.  
  21. /*** キャラクタデータ *******/
  22. extern CHR_DATA        chr_roba;
  23. extern CHR_DATA        chr_penguin;
  24. extern CHR_DATA        chr_jeans;
  25.  
  26.  
  27. #define    CHR_MAX        3            /* キャラクタ数 */
  28.  
  29. #define    SPRITE_FILE    "SELECT"        /* スプライトデータ */
  30.  
  31. #define    MODE_X        88            /* ゲームモード描画位置 */
  32. #define    MODE_Y         8
  33. #define    MODE_H        20
  34.  
  35. #define    CHR_X        64            /* キャラクタ描画位置 */
  36. #define    CHR_Y        96
  37. #define    CHR_W        24
  38. #define    CHR_H        40
  39.  
  40. /*** スプライトコード *****/
  41. #define    SPR_CURSOR1    0x0717            /* カーソル */
  42. #define    SPR_CURSOR2    0x4617
  43.  
  44. #define    CODE0        0x40            /* スプライト格納場所 */
  45. #define    PALET0        0x08            /* パレット格納場所 */
  46.  
  47.  
  48. static
  49. CHR_DATA*    chr_data[CHR_MAX] = {        /* キャラクタデータ */
  50.             &chr_roba,
  51.             &chr_penguin,
  52.             &chr_jeans
  53.         };
  54. static
  55. int        chr_pace[CHR_MAX] = {        /* キャラクタアニメペース */
  56.             8, 16, 12
  57.         };
  58.  
  59. static
  60. char*    mode_menu[3] = {    "  vs COM",        /* ゲームモード */
  61.                 "  vs MAN",
  62.                 "COM vs COM"
  63.     };
  64.  
  65.  
  66. /**********************
  67.     選択初期画面描画
  68.  **********************/
  69. static
  70. void    start_select(void)
  71. {
  72.     int    i, x, y;
  73.  
  74.     _iocs_wipe();                    /* グラフィッククリア */
  75.  
  76.     y = MODE_Y;
  77.     for (i = 0; i < 3; i++) {            /* モードメニュー描画 */
  78.         draw_str(mode_menu[i], MODE_X, y);
  79.         y += MODE_H;
  80.     }
  81.  
  82.     x = CHR_X + 40;
  83.     y = CHR_Y + 8;
  84.     for (i = 0; i < CHR_MAX; i++) {            /* キャラクタ名描画 */
  85.         draw_str(chr_data[i]->name, x, y);
  86.         x += CHR_W;
  87.         y += CHR_H;
  88.     }
  89.  
  90.     _iocs_contrast(-2);                /* フェードイン */
  91. }
  92.  
  93. /******************************************
  94.     キャラクタ描画
  95.     引数    f = アニメーションするか
  96.  ******************************************/
  97. static
  98. void    draw_chr(Bool f)
  99. {
  100.     CODE    code;
  101.     int    i, x, y, k;
  102.  
  103.     code = CODE0 + PALET0*0x100;            /* スプライトコード */
  104.     x = CHR_X;                    /* キャラクタ描画位置 */
  105.     y = CHR_Y;
  106.     for (i = 0; i < CHR_MAX; i++) {
  107.         if ( f ) {
  108.             k = (anim_count/chr_pace[i]) % 4;    /* アニメーション */
  109.             k = (k == 3) ? 2 : ((k == 2) ? 0 : k);
  110.         }
  111.         else {
  112.             k = 0;
  113.         }
  114.         put_sprite(code + k,        x + 16, y + 16);    /* スプライト描画 */
  115.         put_sprite(code + k + 0x10, x + 16, y + 32);
  116.  
  117.         code += 0x103;
  118.         x += CHR_W;
  119.         y += CHR_H;
  120.     }
  121. }
  122.  
  123. /*******************************************
  124.     モード選択画面描画
  125.     引数    sel1, sel2 = セレクト番号
  126.  *******************************************/
  127. static
  128. void    draw_sel_mode(int sel1, int sel2)
  129. {
  130.     int    ssp;
  131.  
  132.     ssp = _iocs_b_super(0);            /* スーパーバイザモード */
  133.     sprite_reg = SPRITE_REG;        /* スプライトレジスタ先頭 */
  134.     v_synch();                /* 垂直同期 */
  135.  
  136.     put_sprite(SPR_CURSOR1 + ((anim_count/8) % 3),        /* 1Pカーソル描画 */
  137.                     MODE_X,      MODE_Y + 16 + MODE_H*sel1);
  138.     put_sprite(SPR_CURSOR2 + ((anim_count/8) % 3),        /* 2Pカーソル描画 */
  139.                     MODE_X + 96, MODE_Y + 16 + MODE_H*sel2);
  140.  
  141.     draw_chr(FALSE);            /* キャラクタ描画 */
  142.  
  143.     while ( (unsigned long)sprite_reg < (unsigned long)(SPRITE_REG + 4*0x100) ) {
  144.         sprite_reg += 3;
  145.         *sprite_reg++ = 0;        /* スプライト非表示 */
  146.     }
  147.     _iocs_b_super(ssp);            /* ユーザーモード */
  148. }
  149.  
  150. /************************************
  151.     モード選択
  152.     引数    opr = 操作バッファ
  153.     戻り値    プレイヤー
  154.  ************************************/
  155. static
  156. int    select_mode(int opr[2])
  157. {
  158.     static int    sel[2] = {0, 0};
  159.     PAD    pad;
  160.     int    i, player;
  161.  
  162.     player = -1;
  163.     while ( player < 0 ) {
  164.         draw_sel_mode(sel[PLAYER1], sel[PLAYER2]);    /* 画面描画 */
  165.         if ( esc_key ) {
  166.             return    -1;            /* ゲーム終了 */
  167.         }
  168.  
  169.         for (i = 0; i < 2; i++) {
  170.             pad = get_rept(i);        /* パッド入力 */
  171.             if ( pad & PAD_A ) {        /* 決定 */
  172.                 player = i;
  173.             }
  174.             else if ( (pad & PAD_UP) && (sel[i] > 0) ) {
  175.                 sel[i]--;
  176.             }
  177.             else if ( (pad & PAD_DOWN) && (sel[i] < 2) ) {
  178.                 sel[i]++;
  179.             }
  180.         }
  181.     }
  182.     switch ( sel[player] ) {
  183.       case 0 :                    /* MAN vs COM */
  184.         opr[PLAYER1] = (player == PLAYER1) ? OPR_PLAYER : OPR_COM;
  185.         opr[PLAYER2] = (player == PLAYER2) ? OPR_PLAYER : OPR_COM;
  186.         break;
  187.       case 1 :                    /* MAN vs MAN */
  188.         opr[PLAYER1] = OPR_PLAYER;
  189.         opr[PLAYER2] = OPR_PLAYER;
  190.         break;
  191.       case 2 :                    /* COM vs COM */
  192.         opr[PLAYER1] = OPR_COM;
  193.         opr[PLAYER2] = OPR_COM;
  194.         break;
  195.       default :
  196.         break;
  197.     }
  198.     return    player;
  199. }
  200.  
  201.  
  202. /*******************************************
  203.     キャラクタ選択画面描画
  204.     引数    sel1, sel2 = セレクト番号
  205.  *******************************************/
  206. static
  207. void    draw_sel_chr(int sel1, int sel2)
  208. {
  209.     int    ssp;
  210.  
  211.     ssp = _iocs_b_super(0);            /* スーパーバイザモード */
  212.     sprite_reg = SPRITE_REG;        /* スプライトレジスタ先頭 */
  213.     v_synch();                /* 垂直同期 */
  214.  
  215.     if ( sel1 >= 0 ) {            /* 1P */
  216.         draw_message(MES_1P, CHR_X - 10 + CHR_W*sel1, CHR_Y + 6 + CHR_H*sel1);
  217.     }
  218.     if ( sel2 >= 0 ) {            /* 2P */
  219.         draw_message(MES_2P, CHR_X + 28 + CHR_W*sel2, CHR_Y + 14 + CHR_H*sel2);
  220.     }
  221.  
  222.     draw_chr(TRUE);                /* キャラクタ描画 */
  223.  
  224.     while ( (unsigned long)sprite_reg < (unsigned long)(SPRITE_REG + 4*0x100) ) {
  225.         sprite_reg += 3;
  226.         *sprite_reg++ = 0;        /* スプライト非表示 */
  227.     }
  228.     _iocs_b_super(ssp);            /* ユーザーモード */
  229. }
  230.  
  231. /************************************************
  232.     キャラクタ選択
  233.     引数    chr = キャラクタデータバッファ
  234.         num = 入力対象
  235.           t = 入力人数
  236.           f = フェードアウトするか
  237.     戻り値     0 : 決定
  238.          1 : キャンセル
  239.         -1 : ゲーム終了
  240.  ************************************************/
  241. int    select_chr(CHR_DATA* chr[2], int num[2], int t, Bool f)
  242. {
  243.     static int    sel[2] = {0, 0};
  244.     PAD    pad;
  245.     int    i, cnt;
  246.  
  247.     cnt = 150;
  248.     while ( cnt > 0 ) {
  249.         draw_sel_chr((((num[0] == 0) || (num[1] == 0)) && (anim_count % 2))
  250.                                 ? - 1 : sel[PLAYER1],
  251.                 (((num[0] == 1) || (num[1] == 1)) && !(anim_count % 2))
  252.                                     ? - 1 : sel[PLAYER2]);
  253.                             /* 画面描画 */
  254.         if ( esc_key ) {
  255.             return    -1;            /* ゲーム終了 */
  256.         }
  257.  
  258.         for (i = 0; i < 2; i++) {
  259.             pad = get_rept(i);
  260.             if  ( pad & PAD_B ) {            /* キャンセル */
  261.                 return    1;
  262.             }
  263.             if ( num[i] >= 0 ) {
  264.                 if ( pad & PAD_A ) {        /* 決定 */
  265.                     chr[num[i]] = chr_data[sel[num[i]]];
  266.                     num[i] = -1;
  267.                     t--;
  268.                 }
  269.                 else if ( (pad & PAD_UP) && (sel[num[i]] > 0) ) {
  270.                     sel[num[i]]--;
  271.                 }
  272.                 else if ( (pad & PAD_DOWN) && (sel[num[i]] < 2) ) {
  273.                     sel[num[i]]++;
  274.                 }
  275.             }
  276.         }
  277.  
  278.         if ( t == 0 ) {
  279.             if ( f ) {                /* フェードアウト */
  280.                 if ( cnt == 150 ) {
  281.                     _iocs_contrast(0);    /* 画面フェードアウト */
  282.                     fadeout_music();    /* BGMフェードアウト */
  283.                 }
  284.                 cnt--;
  285.             }
  286.             else {
  287.                 cnt = 0;
  288.             }
  289.         }
  290.     }
  291.     return    0;
  292. }
  293.  
  294.  
  295. /************************************************
  296.     モード・キャラクタ選択
  297.     引数    chr = キャラクタデータバッファ
  298.         opr = 操作バッファ
  299.     戻り値     TRUE : ゲーム続行
  300.         FALSE : 終了
  301.  ************************************************/
  302. Bool    select(CHR_DATA* chr[2], int opr[2])
  303. {
  304.     int    player, num[2];
  305.     Bool    loop, loop2;
  306.  
  307.     if ( load_sprite(SPRITE_FILE, SPRITE_FILE, CODE0, PALET0) ) {
  308.                                 /* スプライト読み込み */
  309.         return    FALSE;
  310.     }
  311.     play_select_bgm();                    /* BGM演奏開始 */
  312.     start_select();                        /* 初期画面描画 */
  313.  
  314.     loop = TRUE;
  315.     while ( loop ) {
  316.         if ( (player = select_mode(opr)) < 0 ) {    /* モード選択 */
  317.             return    FALSE;
  318.         }
  319.  
  320.         if ( (opr[PLAYER1] == OPR_PLAYER) && (opr[PLAYER2] == OPR_PLAYER) ) {
  321.                                 /* 対戦 */
  322.             num[PLAYER1] = PLAYER1;
  323.             num[PLAYER2] = PLAYER2;
  324.             switch ( select_chr(chr, num, 2, TRUE) ) {
  325.               case 0 :                /* 決定 */
  326.                 loop = FALSE;
  327.                 break;
  328.               case 1 :                /* キャンセル */
  329.                 break;
  330.               default :                /* ゲーム終了 */
  331.                 return    FALSE;
  332.             }
  333.         }
  334.         else {
  335.             num[player ^ 0x01] = -1;
  336.             loop2 = TRUE;
  337.             while ( loop2 ) {
  338.                 num[player] = player;
  339.                 switch ( select_chr(chr, num, 1, FALSE) ) {
  340.                   case 0 :
  341.                     num[player] = player ^ 0x01;
  342.                     switch ( select_chr(chr, num, 1, TRUE) ) {
  343.                       case 0 :
  344.                         loop  = FALSE;
  345.                         loop2 = FALSE;
  346.                         break;
  347.                       case 1 :
  348.                         break;
  349.                       default :
  350.                         return    FALSE;
  351.                     }
  352.                     break;
  353.                   case 1 :
  354.                     loop2 = FALSE;
  355.                     break;
  356.                   default :
  357.                     return    FALSE;
  358.                 }
  359.             }
  360.         }
  361.     }
  362.     return    TRUE;
  363. }
  364.  
  365.  
  366. /************************************************
  367.     自動選択
  368.     引数    chr = キャラクタデータバッファ
  369.         opr = 操作バッファ
  370.  ************************************************/
  371. void    auto_select(CHR_DATA* chr[2], int opr[2])
  372. {
  373.     chr[PLAYER1] = chr_data[rnd(CHR_MAX)];        /* キャラクタ */
  374.     chr[PLAYER2] = chr_data[rnd(CHR_MAX)];
  375.     opr[PLAYER1] = OPR_COM;                /* コンピュータ操作 */
  376.     opr[PLAYER2] = OPR_COM;
  377. }
  378.  
  379. /********************** End of File *******************************************/